package pro.bbs.view.springsession;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession;
import org.springframework.session.web.http.CookieHttpSessionStrategy;
import org.springframework.session.web.http.HttpSessionStrategy;

import javax.sql.DataSource;

/**
 * <p>
 * 一个由spring boot实现会话支持代替HttpSession实现
 * </p>
 *
 * @author 杨阳
 * @since 2017年8月30日10:46:17
 */
// EnableJdbcHttpSession 注解创建了一个实现了Filter的名为springSessionRepositoryFilter的Bean。
// 过滤器负责使用Spring Session支持的一个实现去替换HttpSession，这个实例中Spring Session由关系型数据库支持。
// maxInactiveIntervalInSeconds session失效时间1800秒
// tableName 存储session信息的表名
@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 1801, tableName = "T_SPRING_SESSION")
public class HttpSessionConfig {

    /**
     * <p>
     * 因为@EnableJdbcHttpSession注解中，@Import(JdbcHttpSessionConfiguration.class)，
     * springSessionJdbcOperations方法其实是覆盖 JdbcHttpSessionConfiguration 类中的方法,传入专门的session使用的dataSource
     *
     * @param dataSource session专门的dataSource
     * @return {@link JdbcTemplate}
     * </p>
     */
    //@Qualifier("sessionDataSource") 这个是在spring-datasource.xml中定义的session专用的dataSource
    @Bean
    public JdbcTemplate springSessionJdbcOperations(
            @Qualifier("sessionDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    /**
     * <p>
     * 表示使用cookie来传递session的信息
     * </p>
     *
     * @return {@link CookieHttpSessionStrategy}
     * @author 杨阳
     * @since 2017年11月13日
     */
    @Bean
    public HttpSessionStrategy httpSessionStrategy() {
        return new CookieHttpSessionStrategy();
    }

}
